package iks.render.anim
{
	import flash.display.*;
	import iks.event.*;
	import iks.iface.*;
	import iks.utils.*;
	
	/**
	 * 动画组, 负责管理添加进来的 KSpriteAnimator 对象, 释放资源的时候也会对添加进来的 KSpriteAnimator 对象进行资源释放.
	 * @author StefanieKaka
	 */
	public final class KAnimatorGroup extends Sprite implements IKDispose
	{
		
		/**
		 * 构造函数
		 */
		public function KAnimatorGroup() 
		{
		}
		
///////////////////////////////////////////////////////////////////////////////////////////////////
// 公共域
///////////////////////////////////////////////////////////////////////////////////////////////////

		/**
		 * 添加 KSpriteAnimator 对象, 用于组管理. 添加进来对象的 disposable 属性将设置为 false. 
		 * 在动画播放结束后, 自动释放其资源, 从 KAnimatorGroup 中移除.
		 * @param	animator 添加的 KSpriteAnimator 对象.
		 */
		public function addAnimator(animator : KSpriteAnimator) : void
		{
			animator.disposable = false;
			animator.addEventListener(KAnimatorEvent.PLAY_END, onPlayEndHandler);
			m_anims.push(animator);
			this.addChild(animator);
		}
		
///////////////////////////////////////////////////////////////////////////////////////////////////
// 实现 IKDispose 接口
///////////////////////////////////////////////////////////////////////////////////////////////////
		
		public final function dispose() : void
		{
			if (m_isDisposed)
				return;
			m_isDisposed = true;
			
			for each (var anim : KSpriteAnimator in m_anims)
				releaseAnimator(anim);
				
			m_anims.splice(0, m_anims.length);
			m_anims = null;
			
			Helper.removeChildren(this);
			
			if (this.parent != null)
				this.parent.removeChild(this);
		}
		
///////////////////////////////////////////////////////////////////////////////////////////////////
// 私有域
///////////////////////////////////////////////////////////////////////////////////////////////////
		
		/// 播放结束事件
		private function onPlayEndHandler(evt : KAnimatorEvent) : void
		{
			// 释放 anim 资源
			var anim : KSpriteAnimator = evt.target as KSpriteAnimator;
			releaseAnimator(anim);
			m_anims.splice(m_anims.indexOf(anim), 1);
			if (m_anims.length == 0)
				dispose();
		}
		
		/// 释放 KSpriteAnimator 资源
		private function releaseAnimator(anim : KSpriteAnimator) : void
		{
			anim.removeEventListener(KAnimatorEvent.PLAY_END, onPlayEndHandler);
			this.removeChild(anim);
			anim.dispose();
		}

		private var m_isDisposed : Boolean = false;
		private var m_anims : Vector.<KSpriteAnimator> = new Vector.<KSpriteAnimator>();
	}

}

































///////////////////////////////////////////////////////////////////////////////////////////////////
// end file